package Thread;
//通过单例模式的两种不同构造方法的学习，我们将其应用到多线程模式下可以吗？？？
//可以运用在多线程模式下，但是经过考虑单例模式的懒汉模式在多线段的情况下，会出现一些bug;
//会导致线程的运行缓慢；因为实例化的对象没有做到只创建一次的特点；
// 并且对于有些情况占用内存情况太多，就导致运行的程序崩溃；
//解决办法：进行加锁操做就可以保证多个线程相关的bug问题；
//具体操作：进行包装（创建实例化的对象）保证对象的创建完毕，防止其他线程的干扰操作的正常进行；
class SingleTonLazy{
    private static SingleTonLazy instance=null;
     static Object locker=new Object();
    public static SingleTonLazy getInstance() {
        synchronized (locker) {
            if (instance == null) {
                instance = new SingleTonLazy();
            }
            return instance;
        }
    }
}
public class Demo28_2 {
    public static void main(String[] args) throws InterruptedException {
        Object nm1=new Object();
        Thread t1=new Thread(()->{
            SingleTonLazy.getInstance();
        });
        Thread t2=new Thread(()->{
            SingleTonLazy.getInstance();
        });
        Thread.sleep(5000);
        //通过让主线程先进行休眠，让出CPU资源，这是由于线程的并发执行，线程1和2就会进行调用变量；
        //等到主线程执行完毕后其他两个线程也就已经执行完毕了，这样就可以判断线程加锁后，能否解决线程的相关bug问题呢???
        //通过结果我们发现以及解决了问题；
        //但是我们这个实例只是创建了两个线程，对于程序执行的效率没有多大的影响，
        // 但是如果是多个线程进行呢？？我们会想到一个问题：每个线程都需要进行加锁，明明只是判断一下实例对象是否已经被创建，但是现在就需要，每个线程都需要进行加锁完成；
        //因此：我们应该设计一个判断条件在外部就判断一下这个实例的对象是否已经创建；
        //如果已经存在的话，就不需要进行加锁；
        //如果不存在的话，在进行加锁；
        //这样就大大的提高起来了效率了；

        System.out.println(SingleTonLazy.getInstance()==SingleTonLazy.getInstance());
    }

}
